package com.lizongbo.seotijian.rules.whois;

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.StringReader;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.Socket;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

import com.lizongbo.seotijian.rules.whois.domainhandlers.*;
import com.lizongbo.seotijian.util.HttpUtil;

public class WhoisClient {
	public final static int DEFAULT_PORT = 43;
	public final static String[] TLDS = new String[] { "ac", "ad", "ae",
			"aero", "af", "ag", "ai", "al", "am", "an", "ao", "aq", "ar",
			"arpa", "as", "asia", "at", "au", "aw", "ax", "az", "ba", "bb",
			"bd", "be", "bf", "bg", "bh", "bi", "biz", "bj", "bl", "bm", "bn",
			"bo", "br", "bs", "bt", "bv", "bw", "by", "bz", "ca", "cat", "cc",
			"cd", "cf", "cg", "ch", "ci", "ck", "cl", "cm", "cn", "co", "com",
			"coop", "cr", "cu", "cv", "cx", "cy", "cz", "de", "dj", "dk", "dm",
			"do", "dz", "ec", "edu", "ee", "eg", "eh", "er", "es", "et", "eu",
			"fi", "fj", "fk", "fm", "fo", "fr", "ga", "gb", "gd", "ge", "gf",
			"gg", "gh", "gi", "gl", "gm", "gn", "gov", "gp", "gq", "gr", "gs",
			"gt", "gu", "gw", "gy", "hk", "hm", "hn", "hr", "ht", "hu", "id",
			"ie", "il", "im", "in", "info", "int", "io", "iq", "ir", "is",
			"it", "je", "jm", "jo", "jobs", "jp", "ke", "kg", "kh", "ki", "km",
			"kn", "kp", "kr", "kw", "ky", "kz", "la", "lb", "lc", "li", "lk",
			"lr", "ls", "lt", "lu", "lv", "ly", "ma", "mc", "md", "me", "mf",
			"mg", "mh", "mil", "mk", "ml", "mm", "mn", "mo", "mobi", "mp",
			"mq", "mr", "ms", "mt", "mu", "museum", "mv", "mw", "mx", "my",
			"mz", "na", "name", "nc", "ne", "net", "nf", "ng", "ni", "nl",
			"no", "np", "nr", "nu", "nz", "om", "org", "pa", "pe", "pf", "pg",
			"ph", "pk", "pl", "pm", "pn", "pr", "pro", "ps", "pt", "pw", "py",
			"qa", "re", "ro", "rs", "ru", "rw", "sa", "sb", "sc", "sd", "se",
			"sg", "sh", "si", "sj", "sk", "sl", "sm", "sn", "so", "sr", "st",
			"su", "sv", "sy", "sz", "tc", "td", "tel", "tf", "tg", "th", "tj",
			"tk", "tl", "tm", "tn", "to", "tp", "tr", "travel", "tt", "tv",
			"tw", "tz", "ua", "ug", "uk", "um", "us", "uy", "uz", "va", "vc",
			"ve", "vg", "vi", "vn", "vu", "wf", "ws", "xn--0zwm56d",
			"xn--11b5bs3a9aj6g", "xn--80akhbyknj4f", "xn--9t4b11yi5a",
			"xn--deba0ad", "xn--fiqs8s", "xn--fiqz9s", "xn--fzc2c9e2c",
			"xn--g6w251d", "xn--hgbk6aj7f53bba", "xn--hlcj6aya9esc7a",
			"xn--j6w193g", "xn--jxalpdlp", "xn--kgbechtv", "xn--kprw13d",
			"xn--kpry57d", "xn--mgbaam7a8h", "xn--mgbayh7gpa",
			"xn--mgberp4a5d4ar", "xn--o3cw4h", "xn--p1ai", "xn--pgbs0dh",
			"xn--wgbh1c", "xn--xkc2al3hye2a", "xn--ygbi2ammx", "xn--zckzah",
			"ye", "yt", "za", "zm", "zw" };
	public final static String[][] TLDS_WHOIS = new String[][] {
			{ "ac", "whois.nic.ac" }, { "ad", "" },
			{ "ae", "whois.aeda.net.ae" }, { "aero", "whois.aero" },
			{ "af", "whois.nic.af" }, { "ag", "whois.nic.ag" },
			{ "ai", "whois.ai" }, { "al", "" }, { "am", "whois.amnic.net" },
			{ "an", "" }, { "ao", "" }, { "aq", "" }, { "ar", "" },
			{ "arpa", "whois.iana.org" }, { "as", "whois.nic.as" },
			{ "asia", "whois.nic.asia" }, { "at", "whois.nic.at" },
			{ "au", "whois.audns.net.au" }, { "aw", "" }, { "ax", "" },
			{ "az", "" }, { "ba", "" }, { "bb", "" }, { "bd", "" },
			{ "be", "whois.dns.be" }, { "bf", "" },
			{ "bg", "whois.register.bg" }, { "bh", "" }, { "bi", "" },
			{ "biz", "whois.biz" }, { "bj", "whois.nic.bj" }, { "bl", "" },
			{ "bm", "" }, { "bn", "" }, { "bo", "whois.nic.bo" },
			{ "br", "whois.registro.br" }, { "bs", "" }, { "bt", "" },
			{ "bv", "" }, { "bw", "" }, { "by", "" }, { "bz", "" },
			{ "ca", "whois.cira.ca" }, { "cat", "whois.cat" },
			{ "cc", "ccwhois.verisign-grs.com" }, { "cd", "" }, { "cf", "" },
			{ "cg", "" }, { "ch", "whois.nic.ch" }, { "ci", "whois.nic.ci" },
			{ "ck", "" }, { "cl", "whois.nic.cl" }, { "cm", "" },
			{ "cn", "whois.cnnic.cn" }, { "co", "whois.nic.co" },
			{ "com", "whois.verisign-grs.com" }, { "coop", "whois.nic.coop" },
			{ "cr", "" }, { "cu", "" }, { "cv", "" }, { "cx", "whois.nic.cx" },
			{ "cy", "" }, { "cz", "whois.nic.cz" }, { "de", "whois.denic.de" },
			{ "dj", "" }, { "dk", "whois.dk-hostmaster.dk" },
			{ "dm", "whois.nic.dm" }, { "do", "" }, { "dz", "whois.nic.dz" },
			{ "ec", "whois.nic.ec" }, { "edu", "whois.educause.edu" },
			{ "ee", "whois.tld.ee" }, { "eg", "" }, { "eh", "" }, { "er", "" },
			{ "es", "" }, { "et", "" }, { "eu", "whois.eu" },
			{ "fi", "whois.ficora.fi" }, { "fj", "" }, { "fk", "" },
			{ "fm", "" }, { "fo", "whois.nic.fo" }, { "fr", "whois.nic.fr" },
			{ "ga", "" }, { "gb", "" }, { "gd", "whois.adamsnames.com" },
			{ "ge", "" }, { "gf", "" }, { "gg", "whois.gg" }, { "gh", "" },
			{ "gi", "whois2.afilias-grs.net" }, { "gl", "whois.nic.gl" },
			{ "gm", "" }, { "gn", "" }, { "gov", "whois.dotgov.gov" },
			{ "gp", "" }, { "gq", "" }, { "gr", "" }, { "gs", "whois.nic.gs" },
			{ "gt", "" }, { "gu", "" }, { "gw", "" },
			{ "gy", "whois.registry.gy" }, { "hk", "whois.hkirc.hk" },
			{ "hm", "" }, { "hn", "whois2.afilias-grs.net" }, { "hr", "" },
			{ "ht", "whois.nic.ht" }, { "hu", "" }, { "id", "" },
			{ "ie", "whois.domainregistry.ie" }, { "il", "whois.isoc.org.il" },
			{ "im", "whois.nic.im" }, { "in", "whois.inregistry.net" },
			{ "info", "whois.afilias.net" }, { "int", "whois.iana.org" },
			{ "io", "whois.nic.io" }, { "iq", "" }, { "ir", "whois.nic.ir" },
			{ "is", "whois.isnic.is" }, { "it", "whois.nic.it" },
			{ "je", "whois.je" }, { "jm", "" }, { "jo", "" },
			{ "jobs", "jobswhois.verisign-grs.com" },
			{ "jp", "whois.jprs.jp" }, { "ke", "whois.kenic.or.ke" },
			{ "kg", "whois.domain.kg" }, { "kh", "" },
			{ "ki", "whois.nic.ki" }, { "km", "" }, { "kn", "" },
			{ "kp", "whois.kcce.kp" }, { "kr", "whois.kr" }, { "kw", "" },
			{ "ky", "" }, { "kz", "whois.nic.kz" }, { "la", "whois.nic.la" },
			{ "lb", "" }, { "lc", "" }, { "li", "whois.nic.li" }, { "lk", "" },
			{ "lr", "" }, { "ls", "" }, { "lt", "whois.domreg.lt" },
			{ "lu", "whois.dns.lu" }, { "lv", "whois.nic.lv" },
			{ "ly", "whois.nic.ly" }, { "ma", "whois.iam.net.ma" },
			{ "mc", "" }, { "md", "whois.nic.md" }, { "me", "whois.nic.me" },
			{ "mf", "" }, { "mg", "whois.nic.mg" }, { "mh", "" },
			{ "mil", "" }, { "mk", "" }, { "ml", "" }, { "mm", "" },
			{ "mn", "whois.nic.mn" }, { "mo", "" },
			{ "mobi", "whois.dotmobiregistry.net" }, { "mp", "whois.nic.mp" },
			{ "mq", "" }, { "mr", "" }, { "ms", "whois.nic.ms" }, { "mt", "" },
			{ "mu", "whois.nic.mu" }, { "museum", "whois.museum" },
			{ "mv", "" }, { "mw", "" }, { "mx", "whois.mx" },
			{ "my", "whois.domainregistry.my" }, { "mz", "" },
			{ "na", "whois.na-nic.com.na" }, { "name", "whois.nic.name" },
			{ "nc", "" }, { "ne", "" }, { "net", "whois.verisign-grs.com" },
			{ "nf", "whois.nic.net.nf" }, { "ng", "whois.nic.net.ng" },
			{ "ni", "" }, { "nl", "whois.domain-registry.nl" },
			{ "no", "whois.norid.no" }, { "np", "" }, { "nr", "" },
			{ "nu", "whois.nic.nu" }, { "nz", "whois.srs.net.nz" },
			{ "om", "" }, { "org", "whois.pir.org" }, { "pa", "" },
			{ "pe", "kero.yachay.pe" }, { "pf", "" }, { "pg", "" },
			{ "ph", "" }, { "pk", "" }, { "pl", "whois.dns.pl" },
			{ "pm", "whois.nic.pm" }, { "pn", "" }, { "pr", "whois.nic.pr" },
			{ "pro", "whois.registrypro.pro" }, { "ps", "" },
			{ "pt", "whois.dns.pt" }, { "pw", "" }, { "py", "" }, { "qa", "" },
			{ "re", "whois.nic.re" }, { "ro", "whois.rotld.ro" }, { "rs", "" },
			{ "ru", "whois.ripn.net" }, { "rw", "" },
			{ "sa", "whois.nic.net.sa" }, { "sb", "whois.nic.net.sb" },
			{ "sc", "whois2.afilias-grs.net" }, { "sd", "" },
			{ "se", "whois.iis.se" }, { "sg", "whois.sgnic.sg" },
			{ "sh", "whois.nic.sh" }, { "si", "whois.arnes.si" }, { "sj", "" },
			{ "sk", "whois.sk-nic.sk" }, { "sl", "" },
			{ "sm", "whois.ripe.net" }, { "sn", "whois.nic.sn" },
			{ "so", "whois.nic.so" }, { "sr", "" }, { "st", "whois.nic.st" },
			{ "su", "" }, { "sv", "" }, { "sy", "" }, { "sz", "" },
			{ "tc", "whois.adamsnames.tc" }, { "td", "" },
			{ "tel", "whois.nic.tel" }, { "tf", "whois.nic.tf" }, { "tg", "" },
			{ "th", "whois.thnic.co.th" }, { "tj", "" },
			{ "tk", "whois.dot.tk" }, { "tl", "whois.nic.tl" },
			{ "tm", "whois.nic.tm" }, { "tn", "" }, { "to", "whois.tonic.to" },
			{ "tp", "" }, { "tr", "whois.nic.tr" },
			{ "travel", "whois.nic.travel" }, { "tt", "" },
			{ "tv", "tvwhois.verisign-grs.com" },
			{ "tw", "whois.twnic.net.tw" }, { "tz", "whois.tznic.or.tz" },
			{ "ua", "whois.ua" }, { "ug", "whois.co.ug" },
			{ "uk", "whois.nic.uk" }, { "um", "" }, { "us", "whois.nic.us" },
			{ "uy", "whois.nic.org.uy" }, { "uz", "whois.cctld.uz" },
			{ "va", "" }, { "vc", "whois2.afilias-grs.net" },
			{ "ve", "whois.nic.ve" }, { "vg", "whois.adamsnames.tc" },
			{ "vi", "" }, { "vn", "" }, { "vu", "" }, { "wf", "whois.nic.wf" },
			{ "ws", "whois.website.ws" }, { "xn--0zwm56d", "" },
			{ "xn--11b5bs3a9aj6g", "" }, { "xn--80akhbyknj4f", "" },
			{ "xn--9t4b11yi5a", "" }, { "xn--deba0ad", "" },
			{ "xn--fiqs8s", "cwhois.cnnic.cn" },
			{ "xn--fiqz9s", "cwhois.cnnic.cn" }, { "xn--fzc2c9e2c", "" },
			{ "xn--g6w251d", "" }, { "xn--hgbk6aj7f53bba", "" },
			{ "xn--hlcj6aya9esc7a", "" }, { "xn--j6w193g", "whois.hkirc.hk" },
			{ "xn--jxalpdlp", "" }, { "xn--kgbechtv", "" },
			{ "xn--kprw13d", "whois.twnic.net.tw" },
			{ "xn--kpry57d", "whois.twnic.net.tw" },
			{ "xn--mgbaam7a8h", "whois.aeda.net.ae" },
			{ "xn--mgbayh7gpa", "" },
			{ "xn--mgberp4a5d4ar", "whois.nic.net.sa" },
			{ "xn--o3cw4h", "whois.thnic.co.th" },
			{ "xn--p1ai", "whois.ripn.net" }, { "xn--pgbs0dh", "" },
			{ "xn--wgbh1c", "" }, { "xn--xkc2al3hye2a", "" },
			{ "xn--ygbi2ammx", "whois.pnina.ps" }, { "xn--zckzah", "" },
			{ "ye", "" }, { "yt", "whois.nic.yt" }, { "za", "" }, { "zm", "" },
			{ "zw", "" } };

	public final static String[][] TLDS_WHOIS_LINUX = new String[][] {
			{ ".br.com", "whois.centralnic.net", },//
			{ ".cn.com", "whois.centralnic.net", },//
			{ ".de.com", "whois.centralnic.net", },//
			{ ".eu.com", "whois.centralnic.net", },//
			{ ".gb.com", "whois.centralnic.net", },//
			{ ".gb.net", "whois.centralnic.net", },//
			{ ".hu.com", "whois.centralnic.net", },//
			{ ".no.com", "whois.centralnic.net", },//
			{ ".qc.com", "whois.centralnic.net", },//
			{ ".ru.com", "whois.centralnic.net", },//
			{ ".sa.com", "whois.centralnic.net", },//
			{ ".se.com", "whois.centralnic.net", },//
			{ ".se.net", "whois.centralnic.net", },//
			{ ".uk.com", "whois.centralnic.net", },//
			{ ".uk.net", "whois.centralnic.net", },//
			{ ".us.com", "whois.centralnic.net", },//
			{ ".uy.com", "whois.centralnic.net", },//
			{ ".za.com", "whois.centralnic.net", },//
			{ ".jpn.com", "whois.centralnic.net", },//
			{ ".web.com", "whois.centralnic.net", },//
			{ ".com", "\\x04whois.crsnic.net", },//
			{ ".za.net", "whois.za.net", },//
			{ ".net", "\\x04whois.crsnic.net", },//
			{ ".eu.org", "whois.eu.org", },//
			{ ".za.org", "whois.za.org", },//
			{ ".org", "\\x07", },//
			{ ".edu", "whois.educause.net", },//
			{ ".gov", "whois.nic.gov", },//
			{ ".int", "whois.iana.org", },//
			{ ".mil", "\\x03", },//
			{ ".e164.arpa", "whois.ripe.net", },//
			{ ".in-addr.arpa", "\\x0C", },//
			{ ".arpa", "whois.iana.org", },//
			{ ".aero", "whois.aero", },//
			{ ".asia", "whois.nic.asia", },//
			{ ".biz", "whois.nic.biz", },//
			{ ".cat", "whois.cat", },//
			{ ".coop", "whois.nic.coop", },//
			{ ".info", "whois.afilias.info", },//
			{ ".jobs", "\\x04jobswhois.verisign-grs.com", },//
			{ ".mobi", "whois.dotmobiregistry.net", },//
			{ ".museum", "whois.museum", },//
			{ ".name", "whois.nic.name", },//
			{ ".pro", "whois.registrypro.pro", },//
			{ ".tel", "whois.nic.tel", },//
			{ ".travel", "whois.nic.travel", },//
			{ ".ac", "whois.nic.ac", },//
			{ ".ad", "\\x03", },//
			{ ".ae", "whois.aeda.net.ae", },//
			{ ".af", "whois.nic.af", },//
			{ ".ag", "whois.nic.ag", },//
			{ ".ai", "whois.ai", },//
			{ ".al", "\\x03", },//
			{ ".am", "whois.nic.am", },//
			{ ".an", "\\x03", },//
			{ ".ao", "\\x03", },//
			{ ".aq", "\\x03", },//
			{ ".ar", "\\x01http://www.nic.ar/", },//
			{ ".as", "whois.nic.as", },//
			{ ".priv.at", "whois.nic.priv.at", },//
			{ ".at", "whois.nic.at", },//
			{ ".au", "whois.ausregistry.net.au", },//
			{ ".aw", "\\x03", },//
			{ ".ax", "\\x03", },//
			{ ".az", "\\x01http://www.nic.az/AzCheck.htm", },//
			{ ".ba", "\\x01http://www.nic.ba/stream/whois/", },//
			{ ".bb", "\\x01http://whois.telecoms.gov.bb/search_domain.php", },//
			{ ".bd", "\\x01http://whois.btcl.net.bd/", },//
			{ ".be", "whois.dns.be", },//
			{ ".bf", "\\x03", },//
			{ ".bg", "whois.register.bg", },//
			{ ".bh", "\\x03", },//
			{ ".bi", "\\x01http://whois.nic.bi/register/whois.hei", },//
			{ ".bj", "whois.nic.bj", },//
			{
					".bm",
					"\\x01http://207.228.133.14/cgi-bin/lansaweb?procfun+BMWHO+BMWHO2+WHO", },//
			{ ".bn", "\\x03", },//
			{ ".bo", "whois.nic.bo", },//
			{ ".br", "whois.nic.br", },//
			{ ".bs", "\\x01http://www.nic.bs/cgi-bin/search.pl", },//
			{ ".bt", "\\x01http://www.nic.bt/", },//
			{ ".bv", "\\x03", },//
			{ ".by", "\\x01http://www.tld.by/indexeng.html", },//
			{ ".bw", "\\x03", },//
			{ ".bz", "\\x08", },//
			{ ".co.ca", "whois.co.ca", },//
			{ ".ca", "whois.cira.ca", },//
			{ ".cc", "\\x04whois.nic.cc", },//
			{ ".cd", "whois.nic.cd", },//
			{ ".cf", "\\x03", },//
			{ ".cg", "\\x01http://www.nic.cg/cgi-bin/whois.pl", },//
			{ ".ch", "whois.nic.ch", },//
			{ ".ci", "www.nic.ci", },//
			{ ".ck", "whois.nic.ck", },//
			{ ".cl", "whois.nic.cl", },//
			{ ".cm", "whois.netcom.cm", },//
			{ ".edu.cn", "whois.edu.cn", },//
			{ ".cn", "whois.cnnic.cn", },//
			{ ".uk.co", "whois.uk.co", },//
			{ ".co", "\\x01http://www.whois.co/", },//
			{
					".cr",
					"\\x01http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do", },//
			{ ".cu", "\\x01http://www.nic.cu/", },//
			{ ".cv", "\\x03", },//
			{ ".cx", "whois.nic.cx", },//
			{ ".cy", "\\x01http://www.nic.cy/nslookup/online_database.php", },//
			{ ".cz", "whois.nic.cz", },//
			{ ".de", "whois.denic.de", },//
			{ ".dj", "\\x01http://www.nic.dj/whois.php", },//
			{ ".dk", "whois.dk-hostmaster.dk", },//
			{ ".dm", "whois.nic.dm", },//
			{ ".do", "\\x01http://www.nic.do/whois-h.php3", },//
			{ ".dz", "whois.nic.dz", },//
			{ ".ec", "\\x01http://www.nic.ec/whois/eng/whois.asp", },//
			{ ".ee", "whois.eenet.ee", },//
			{ ".eg", "\\x03", },//
			{ ".er", "\\x03", },//
			{ ".es", "\\x01https://www.nic.es/", },//
			{ ".et", "\\x03", },//
			{ ".eu", "whois.eu", },//
			{ ".fi", "whois.ficora.fi", },//
			{ ".fj", "whois.usp.ac.fj", },//
			{ ".fk", "\\x03", },//
			{ ".fm", "\\x01http://www.dot.fm/whois.html", },//
			{ ".fo", "whois.ripe.net", },//
			{ ".fr", "whois.nic.fr", },//
			{ ".ga", "\\x03", },//
			{ ".gb", "\\x03", },//
			{ ".gd", "whois.adamsnames.tc", },//
			{ ".ge", "\\x01http://www.registration.ge/", },//
			{ ".gf", "\\x01http://www.nic.gf/?id=whois", },//
			{ ".gg", "whois.gg", },//
			{ ".gh", "\\x01http://www.nic.gh/customer/search_c.htm", },//
			{ ".gi", "\\x08", },//
			{ ".gl", "whois.nic.gl", },//
			{ ".gm", "whois.ripe.net", },//
			{ ".gn", "\\x03", },//
			{ ".gp", "whois.nic.gp", },//
			{ ".gq", "\\x03", },//
			{ ".gr", "\\x01https://grweb.ics.forth.gr/whois_en.jsp", },//
			{ ".gs", "whois.nic.gs", },//
			{ ".gt", "\\x01http://www.gt/whois.html", },//
			{ ".gu", "\\x01http://gadao.gov.gu/domainsearch.htm", },//
			{ ".gw", "\\x03", },//
			{ ".gy", "whois.registry.gy", },//
			{ ".hk", "whois.hkirc.hk", },//
			{ ".hm", "whois.registry.hm", },//
			{ ".hn", "\\x08", },//
			{ ".hr", "\\x01http://www.dns.hr/pretrazivanje.html", },//
			{ ".ht", "whois.nic.ht", },//
			{ ".hu", "whois.nic.hu", },//
			{ ".id", "whois.pandi.or.id", },//
			{ ".ie", "whois.domainregistry.ie", },//
			{ ".il", "whois.isoc.org.il", },//
			{ ".im", "whois.nic.im", },//
			{ ".in", "whois.registry.in", },//
			{ ".io", "whois.nic.io", },//
			{ ".iq", "\\x03", },//
			{ ".ir", "whois.nic.ir", },//
			{ ".is", "whois.isnic.is", },//
			{ ".it", "whois.nic.it", },//
			{ ".je", "whois.je", },//
			{ ".jm", "\\x03", },//
			{ ".jo", "\\x01http://www.dns.jo/Whois.aspx", },//
			{ ".jp", "whois.jprs.jp", },//
			{ ".ke", "whois.kenic.or.ke", },//
			{ ".kg", "whois.domain.kg", },//
			{ ".kh", "\\x03", },//
			{ ".ki", "whois.nic.mu", },//
			{ ".km", "\\x03", },//
			{ ".kn", "\\x01http://www.nic.kn/", },//
			{ ".kp", "whois.kcce.kp", },//
			{ ".kr", "whois.nic.or.kr", },//
			{ ".kw", "\\x01http://www.kw/", },//
			{ ".ky", "\\x01http://kynseweb.messagesecure.com/kywebadmin/", },//
			{ ".kz", "whois.nic.kz", },//
			{ ".la", "whois.nic.la", },//
			{ ".lb", "\\x01http://www.aub.edu.lb/lbdr/", },//
			{ ".lc", "\\x08", },//
			{ ".li", "whois.nic.li", },//
			{ ".lk", "\\x03", },//
			{ ".lr", "\\x03", },//
			{ ".ls", "\\x01http://www.co.ls/co.asp", },//
			{ ".lt", "whois.domreg.lt", },//
			{ ".lu", "whois.dns.lu", },//
			{ ".lv", "whois.nic.lv", },//
			{ ".ly", "whois.nic.ly", },//
			{ ".ma", "whois.iam.net.ma", },//
			{ ".mc", "whois.ripe.net", },//
			{ ".md", "\\x01http://www.dns.md/wh1.php", },//
			{ ".me", "whois.meregistry.net", },//
			{ ".mg", "whois.nic.mg", },//
			{ ".mh", "\\x03", },//
			{ ".mk", "\\x01http://dns.marnet.net.mk/registar.php", },//
			{ ".ml", "\\x03", },//
			{ ".mm", "\\x03", },//
			{ ".mn", "\\x08", },//
			{ ".mo", "\\x01http://www.monic.net.mo/", },//
			{ ".mp", "\\x03", },//
			{ ".mq", "\\x03", },//
			{ ".mr", "\\x03", },//
			{ ".ms", "whois.nic.ms", },//
			{ ".mt", "\\x01https://www.nic.org.mt/dotmt/", },//
			{ ".mu", "whois.nic.mu", },//
			{ ".mv", "\\x03", },//
			{ ".mw", "\\x01http://www.registrar.mw/", },//
			{ ".mx", "whois.nic.mx", },//
			{ ".my", "whois.domainregistry.my", },//
			{ ".mz", "\\x03", },//
			{ ".na", "whois.na-nic.com.na", },//
			{ ".nc", "whois.cctld.nc", },//
			{ ".ne", "\\x03", },//
			{ ".nf", "whois.nic.nf", },//
			{ ".ng", "whois.register.net.ng", },//
			{ ".ni", "\\x01http://www.nic.ni/", },//
			{ ".nl", "whois.domain-registry.nl", },//
			{ ".no", "whois.norid.no", },//
			{ ".np", "\\x01http://register.mos.com.np/userSearchInc.asp", },//
			{ ".nr", "\\x01http://www.cenpac.net.nr/dns/whois.html", },//
			{ ".nu", "whois.nic.nu", },//
			{ ".nz", "whois.srs.net.nz", },//
			{ ".om", "\\x01http://www.omnic.om/onlineUser/WHOISLookup.jsp", },//
			{ ".pa", "\\x01http://www.nic.pa/", },//
			{ ".pe", "whois.nic.pe", },//
			{ ".pf", "\\x03", },//
			{ ".pg", "\\x03", },//
			{ ".ph", "\\x01http://www.dot.ph/", },//
			{ ".pk", "\\x01http://www.pknic.net.pk/", },//
			{ ".co.pl", "whois.co.pl", },//
			{ ".pl", "whois.dns.pl", },//
			{ ".pm", "whois.nic.fr", },//
			{ ".pn", "\\x01http://www.pitcairn.pn/PnRegistry/", },//
			{ ".pr", "whois.nic.pr", },//
			{ ".ps", "whois.pnina.ps", },//
			{ ".pt", "whois.dns.pt", },//
			{ ".pw", "\\x03", },//
			{ ".py", "\\x01http://www.nic.py/consultas.html", },//
			{ ".qa", "\\x03", },//
			{ ".re", "whois.nic.fr", },//
			{ ".ro", "whois.rotld.ro", },//
			{ ".rs", "\\x01http://www.nic.rs/en/whois", },//
			{ ".edu.ru", "whois.informika.ru", },//
			{ ".ru", "whois.ripn.net", },//
			{ ".rw", "\\x01http://www.nic.rw/cgi-bin/whois.pl", },//
			{ ".sa", "whois.nic.net.sa", },//
			{ ".sb", "whois.coccaregistry.net", },//
			{ ".sc", "\\x08", },//
			{ ".sd", "\\x03", },//
			{ ".se", "whois.nic-se.se", },//
			{ ".sg", "whois.nic.net.sg", },//
			{ ".sh", "whois.nic.sh", },//
			{ ".si", "whois.arnes.si", },//
			{ ".sj", "\\x03", },//
			{ ".sk", "whois.sk-nic.sk", },//
			{ ".sl", "whois.nic.sl", },//
			{ ".sm", "whois.ripe.net", },//
			{ ".sn", "whois.nic.sn", },//
			{ ".so", "\\x03", },//
			{ ".sr", "\\x03", },//
			{ ".st", "whois.nic.st", },//
			{ ".su", "whois.ripn.net", },//
			{ ".sv", "\\x01http://www.uca.edu.sv/dns/", },//
			{ ".sy", "\\x03", },//
			{ ".sz", "\\x03", },//
			{ ".tc", "whois.adamsnames.tc", },//
			{ ".td", "\\x03", },//
			{ ".tf", "whois.nic.tf", },//
			{ ".tg", "\\x01http://www.nic.tg/", },//
			{ ".th", "whois.thnic.co.th", },//
			{ ".tj", "\\x01http://www.nic.tj/whois.html", },//
			{ ".tk", "whois.dot.tk", },//
			{ ".tl", "whois.nic.tl", },//
			{ ".tm", "whois.nic.tm", },//
			{ ".tn", "\\x01http://whois.ati.tn/", },//
			{ ".to", "whois.tonic.to", },//
			{ ".tp", "\\x03", },//
			{ ".tr", "whois.nic.tr", },//
			{ ".tt", "\\x01http://www.nic.tt/cgi-bin/search.pl", },//
			{ ".tv", "\\x04whois.nic.tv", },//
			{ ".tw", "whois.twnic.net.tw", },//
			{ ".tz", "whois.tznic.or.tz", },//
			{ ".ua", "whois.net.ua", },//
			{ ".ug", "www.registry.co.ug", },//
			{ ".ac.uk", "whois.ja.net", },//
			{ ".bl.uk", "\\x03", },//
			{ ".british-library.uk", "\\x03", },//
			{ ".gov.uk", "whois.ja.net", },//
			{ ".icnet.uk", "\\x03", },//
			{ ".jet.uk", "\\x03", },//
			{ ".mod.uk", "\\x03", },//
			{ ".nhs.uk", "\\x03", },//
			{ ".nls.uk", "\\x03", },//
			{ ".parliament.uk", "\\x03", },//
			{ ".police.uk", "\\x03", },//
			{ ".uk", "whois.nic.uk", },//
			{ ".fed.us", "whois.nic.gov", },//
			{ ".us", "whois.nic.us", },//
			{ ".com.uy", "\\x01https://nic.anteldata.com.uy/dns/", },//
			{ ".uy", "whois.nic.org.uy", },//
			{ ".uz", "whois.cctld.uz", },//
			{ ".va", "whois.ripe.net", },//
			{ ".vc", "\\x08", },//
			{ ".ve", "whois.nic.ve", },//
			{ ".vg", "whois.adamsnames.tc", },//
			{ ".vi", "\\x01http://www.nic.vi/whoisform.htm", },//
			{ ".vn", "\\x01http://www.vnnic.vn/english/", },//
			{ ".vu", "\\x01http://www.vunic.vu/whois.html", },//
			{ ".wf", "whois.nic.fr", },//
			{ ".ws", "whois.samoanic.ws", },//
			{ ".ye", "\\x03", },//
			{ ".yt", "whois.nic.fr", },//
			{ ".ac.za", "whois.ac.za", },//
			{ ".co.za", "whois.coza.net.za", },//
			{ ".gov.za", "whois.gov.za", },//
			{ ".org.za", "\\x01http://www.org.za/", },//
			{ ".za", "\\x03", },//
			{ ".zm", "\\x03", },//
			{ ".zw", "\\x03", },//
			{ ".xn--fiqs8s", "cwhois.cnnic.cn", },//
			{ ".xn--fiqz9s", "cwhois.cnnic.cn", },//
			{ ".xn--fzc2c9e2c", "\\x03", },//
			{ ".xn--j6w193g", "whois.hkirc.hk", },//
			{ ".xn--kprw13d", "whois.twnic.net.tw", },//
			{ ".xn--kpry57d", "whois.twnic.net.tw", },//
			{ ".xn--mgbaam7a8h", "whois.aeda.net.ae", },//
			{ ".xn--mgbayh7gpa", "\\x03", },//
			{ ".xn--mgberp4a5d4ar", "whois.nic.net.sa", },//
			{ ".xn--o3cw4h", "whois.thnic.co.th", },//
			{ ".xn--p1ai", "whois.ripn.net", },//
			{ ".xn--pgbs0dh", "\\x03", },//
			{ ".xn--wgbh1c", "whois.dotmasr.eg", },//
			{ ".xn--xkc2al3hye2a", "\\x03", },//
			{ ".xn--ygbi2ammx", "whois.pnina.ps", },//
			{ "-dom", "whois.networksolutions.com", },//
			{ "-org", "whois.networksolutions.com", },//
			{ "-hst", "whois.networksolutions.com", },//
			{ "-arin", "whois.arin.net", },//
			{ "-ripe", "whois.ripe.net", },//
			{ "-mnt", "whois.ripe.net", },//
			{ "-lacnic", "whois.lacnic.net", },//
			{ "-afrinic", "whois.afrinic.net", },//
			{ "-ap", "whois.apnic.net", },//
			{ "-ar", "whois.aunic.net", },//
			{ "-cn", "whois.cnnic.net.cn", },//
			{ "-cz", "whois.nic.cz", },//
			{ "-dk", "whois.dk-hostmaster.dk", },//
			{ "-il", "whois.isoc.org.il", },//
			{ "-is", "whois.isnic.is", },//
			{ "-kg", "whois.domain.kg", },//
			{ "-ti", "whois.telstra.net", },//
			{ "-tw", "whois.twnic.net.tw", },//
			{ "-6bone", "whois.6bone.net", },//
			{ "-coop", "whois.nic.coop", },//
			{ "-cknic", "whois.nic.ck", },//
			{ "-idnic", "whois.idnic.net.id", },//
			{ "-itnic", "whois.nic.it", },//
			{ "-frnic", "whois.nic.fr", },//
			{ "-gandi", "whois.gandi.net", },//
			{ "-kenic", "whois.kenic.or.ke", },//
			{ "-lrms", "whois.afilias.info", },//
			{ "-metu", "whois.metu.edu.tr", },//
			{ "-nicat", "whois.nic.at", },//
			{ "-nicir", "whois.nic.ir", },//
			{ "-norid", "whois.norid.no", },//
			{ "-ripn", "whois.ripn.net", },//
			{ "-rotld", "whois.rotld.ro", },//
			{ "-sgnic", "whois.nic.net.sg", },//
			{ "-tel", "whois.nic.tel", },//
			{ "-uanic", "whois.com.ua", },//
			{ "-uynic", "www.rau.edu.uy", },//
			{ "-sixxs", "whois.sixxs.net", },//
	};
	/**
	 * 通过web接口可以查询whois的顶级域名
	 */
	public final static String[][] TLDS_WHOIS_WEB = new String[][] {
			{ ".ar", "http://www.nic.ar/" },//
			{ ".az", "http://www.nic.az/AzCheck.htm" },//
			{ ".ba", "http://www.nic.ba/stream/whois/" },//
			{ ".bb", "http://whois.telecoms.gov.bb/search_domain.php" },//
			{ ".bd", "http://whois.btcl.net.bd/" },//
			{ ".bi", "http://whois.nic.bi/register/whois.hei" },//
			{ ".bm ",
					"http://207.228.133.14/cgi-bin/lansaweb?procfun+BMWHO+BMWHO2+WHO" },//
			{ ".bs", "http://www.nic.bs/cgi-bin/search.pl" },//
			{ ".bt", "http://www.nic.bt/" },//
			{ ".by", "http://www.tld.by/indexeng.html" },//
			{ ".cg", "http://www.nic.cg/cgi-bin/whois.pl" },//
			{ ".co", "http://www.whois.co/" },//
			{ ".cr ",
					"http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do" },//
			{ ".cu", "http://www.nic.cu/" },//
			{ ".cy", "http://www.nic.cy/nslookup/online_database.php" },//
			{ ".dj", "http://www.nic.dj/whois.php" },//
			{ ".do", "http://www.nic.do/whois-h.php3" },//
			{ ".ec", "http://www.nic.ec/whois/eng/whois.asp" },//
			{ ".es", "https://www.nic.es/" },//
			{ ".fm", "http://www.dot.fm/whois.html",
					"http://www.dot.fm/query_whois.cfm?domain=$domain&tld=fm&x=27&y=10" },//
			{ ".ge", "http://www.registration.ge/" },//
			{ ".gf", "http://www.nic.gf/?id=whois" },//
			{ ".gh", "http://www.nic.gh/customer/search_c.htm" },//
			{ ".gr", "https://grweb.ics.forth.gr/whois_en.jsp" },//
			{ ".gt", "http://www.gt/whois.html" },//
			{ ".gu", "http://gadao.gov.gu/domainsearch.htm" },//
			{ ".hr", "http://www.dns.hr/pretrazivanje.html" },//
			{ ".jo", "http://www.dns.jo/Whois.aspx" },//
			{ ".kn", "http://www.nic.kn/" },//
			{ ".kw", "http://www.kw/" },//
			{ ".ky", "http://kynseweb.messagesecure.com/kywebadmin/" },//
			{ ".lb", "http://www.aub.edu.lb/lbdr/" },//
			{ ".ls", "http://www.co.ls/co.asp" },//
			{ ".md", "http://www.dns.md/wh1.php" },//
			{ ".mk", "http://dns.marnet.net.mk/registar.php" },//
			{ ".mo", "http://www.monic.net.mo/" },//
			{ ".mt", "https://www.nic.org.mt/dotmt/" },//
			{ ".mw", "http://www.registrar.mw/" },//
			{ ".ni", "http://www.nic.ni/" },//
			{ ".np", "http://register.mos.com.np/userSearchInc.asp" },//
			{ ".nr", "http://www.cenpac.net.nr/dns/whois.html" },//
			{ ".om", "http://www.omnic.om/onlineUser/WHOISLookup.jsp" },//
			{ ".pa", "http://www.nic.pa/" },//
			{ ".ph", "http://www.dot.ph/" },//
			{ ".pk", "http://www.pknic.net.pk/" },//
			{ ".pn", "http://www.pitcairn.pn/PnRegistry/" },//
			{ ".py", "http://www.nic.py/consultas.html" },//
			{ ".rs", "http://www.nic.rs/en/whois" },//
			{ ".rw", "http://www.nic.rw/cgi-bin/whois.pl" },//
			{ ".sv", "http://www.uca.edu.sv/dns/" },//
			{ ".tg", "http://www.nic.tg/" },//
			{ ".tj", "http://www.nic.tj/whois.html" },//
			{ ".tn", "http://whois.ati.tn/" },//
			{ ".tt", "http://www.nic.tt/cgi-bin/search.pl" },//
			{ ".vi", "http://www.nic.vi/whoisform.htm" },//
			{ ".vn", "http://www.vnnic.vn/english/" },//
			{ ".vu", "http://www.vunic.vu/whois.html" },//
	};
	private final static java.util.HashMap<String, DomainHandler> handlerMap = new HashMap<String, DomainHandler>();
	static {
		handlerMap.put(".ar", new ARDomainHandler());
		handlerMap.put(".az", new AZDomainHandler());
		handlerMap.put(".ba", new BADomainHandler());
		handlerMap.put(".bb", new BBDomainHandler());
		handlerMap.put(".bd", new BDDomainHandler());
		handlerMap.put(".bi", new BIDomainHandler());
		handlerMap.put(".bm ", new BMDomainHandler());
		handlerMap.put(".bs", new BSDomainHandler());
		handlerMap.put(".bt", new BTDomainHandler());
		handlerMap.put(".by", new BYDomainHandler());
		handlerMap.put(".cg", new CGDomainHandler());
		handlerMap.put(".co", new CODomainHandler());
		handlerMap.put(".cr ", new CRDomainHandler());
		handlerMap.put(".cu", new CUDomainHandler());
		handlerMap.put(".cy", new CYDomainHandler());
		handlerMap.put(".dj", new DJDomainHandler());
		handlerMap.put(".do", new DODomainHandler());
		handlerMap.put(".ec", new ECDomainHandler());
		handlerMap.put(".es", new ESDomainHandler());
		handlerMap.put(".fm", new FMDomainHandler());
		handlerMap.put(".ge", new GEDomainHandler());
		handlerMap.put(".gf", new GFDomainHandler());
		handlerMap.put(".gh", new GHDomainHandler());
		handlerMap.put(".gr", new GRDomainHandler());
		handlerMap.put(".gt", new GTDomainHandler());
		handlerMap.put(".gu", new GUDomainHandler());
		handlerMap.put(".hr", new HRDomainHandler());
		handlerMap.put(".jo", new JODomainHandler());
		handlerMap.put(".kn", new KNDomainHandler());
		handlerMap.put(".kw", new KWDomainHandler());
		handlerMap.put(".ky", new KYDomainHandler());
		handlerMap.put(".lb", new LBDomainHandler());
		handlerMap.put(".ls", new LSDomainHandler());
		handlerMap.put(".md", new MDDomainHandler());
		handlerMap.put(".mk", new MKDomainHandler());
		handlerMap.put(".mo", new MODomainHandler());
		handlerMap.put(".mt", new MTDomainHandler());
		handlerMap.put(".mw", new MWDomainHandler());
		handlerMap.put(".ni", new NIDomainHandler());
		handlerMap.put(".np", new NPDomainHandler());
		handlerMap.put(".nr", new NRDomainHandler());
		handlerMap.put(".om", new OMDomainHandler());
		handlerMap.put(".pa", new PADomainHandler());
		handlerMap.put(".ph", new PHDomainHandler());
		handlerMap.put(".pk", new PKDomainHandler());
		handlerMap.put(".pn", new PNDomainHandler());
		handlerMap.put(".py", new PYDomainHandler());
		handlerMap.put(".rs", new RSDomainHandler());
		handlerMap.put(".rw", new RWDomainHandler());
		handlerMap.put(".sv", new SVDomainHandler());
		handlerMap.put(".tg", new TGDomainHandler());
		handlerMap.put(".tj", new TJDomainHandler());
		handlerMap.put(".tn", new TNDomainHandler());
		handlerMap.put(".tt", new TTDomainHandler());
		handlerMap.put(".vi", new VIDomainHandler());
		handlerMap.put(".vn", new VNDomainHandler());
		handlerMap.put(".vu", new VUDomainHandler());

	}

	public static String getWhoisInfo(String domain, boolean useCache) {
		if (domain == null || domain.length() < 1) {
			return "";
		}
		domain = domain.toLowerCase();
		if (useCache) {
			CacheManager cm = CacheManager.getInstance();
			Cache whoisInfoCache = cm.getCache("whoisInfoCache");
			Element ce = whoisInfoCache.get(domain);
			if (ce != null) {
				String s = (String) ce.getValue();
				System.out.println("getWhoisInfo from cache for:" + domain);
				return s;
			}
			String s = getWhoisInfo(domain);
			if (s != null && s.length() > 1) {
				whoisInfoCache.put(new Element(domain, s));
			}
			return s;
		}
		return getWhoisInfo(domain);
	}

	public static String getWhoisInfo(String domain) {
		if (domain == null || domain.length() < 1) {
			return "";
		}
		String idndomain = java.net.IDN.toASCII(domain.toLowerCase());
		domain = idndomain;
		for (String tld : handlerMap.keySet()) {
			if (domain.endsWith(tld)) {
				return handlerMap.get(tld).getWhoisInfo(domain);
			}
		}
		String whoisServer = getWhoisServer(domain);
		String txt = getWhoisInfo(domain, whoisServer);
		String whoisServerTmp = findWhoisServer(txt);
		System.out.println("whoisServerTmp == " + whoisServerTmp + " ,for:"
				+ domain);
		if (whoisServerTmp != null && whoisServerTmp.length() > 0) {
			System.out.println("try getWhoisInfo for:" + domain + ",from "
					+ whoisServer + ",but real whois server:" + whoisServerTmp);
			String txtTmp = getWhoisInfo(domain, whoisServerTmp);
			if (txtTmp != null && txtTmp.length() > 0) {
				txt = txtTmp;
			}
		}
		return txt;
	}

	private static String findWhoisServer(String whoistxt) {
		try {
			if (whoistxt.indexOf("Domain Name:") > 0) {
				whoistxt = whoistxt.substring(whoistxt.indexOf("Domain Name:"));
			}
			if (whoistxt != null && whoistxt.contains("Whois Server:")) {
				BufferedReader in = new BufferedReader(new StringReader(
						whoistxt));
				String line;
				while ((line = in.readLine()) != null) {
					line = line.trim();
					if (line.indexOf("Whois Server:") >= 0) {
						String whoisServerTmp = line.substring(
								line.indexOf("Whois Server:")
										+ "Whois Server:".length()).trim();
						return whoisServerTmp;
					}
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return "";
	}

	/**
	 * 获取whois信息
	 * 
	 * @param domain
	 * @param whoisServer
	 * @return
	 */
	public static String getWhoisInfo(String domain, String whoisServer) {
		System.out.println("try getWhoisInfo for:" + domain + ",from "
				+ whoisServer);
		String whoisInfo = getWhoisInfo(domain, whoisServer, DEFAULT_PORT);
		// System.out.println("getWhoisInfo for " + domain + "," + whoisServer
		// + ",result:" + whoisInfo);
		return whoisInfo;
	}

	/**
	 * 从指定的whois服务器获取域名信息
	 * 
	 * @param domain
	 * @param whoisServer
	 * @param whoisServerPort
	 * @return
	 */
	public static String getWhoisInfo(String domain, String whoisServer,
			int whoisServerPort) {
		String rs = "";
		if (whoisServer == null || whoisServer.length() < 1
				|| whoisServerPort < 0) {
			return rs;
		}
		try {
			StringBuilder sb = new StringBuilder(4092);
			Socket theSocket = new Socket(whoisServer, DEFAULT_PORT);
			theSocket.setSoTimeout(5000);
			Writer out = new OutputStreamWriter(theSocket.getOutputStream());
			out.write(domain);
			out.write("\r\n");
			out.flush();
			BufferedReader in = new BufferedReader(new InputStreamReader(
					theSocket.getInputStream(), "UTF-8"));
			String line;
			while ((line = in.readLine()) != null) {
				sb.append(line).append('\n');
			}
			rs = sb.toString();
		} catch (Exception e) {
			System.out.println("try getWhoisInfo for:" + domain + " from "
					+ whoisServer + ":" + whoisServerPort + ", but err:"
					+ e.getMessage());
			e.printStackTrace();
		}
		return rs;

	}

	// public static String getNameServer(String domain) {
	// try {
	// SimpleResolver resolver = new SimpleResolver("8.8.8.8");
	// try {
	// Lookup lookup = new Lookup(domain, Type.NS);
	// lookup.setResolver(resolver);
	// lookup.run();
	// int result = lookup.getResult();
	// if (result != Lookup.SUCCESSFUL) {
	// System.out.println("=====" + domain + ", err:"
	// + lookup.getErrorString());
	// // appendToFile("e:/temp/nserrnew.log", domain + "\n");
	// } else {
	// Record[] answers = lookup.getAnswers();
	// if (answers == null || answers.length < 1) {
	// System.out.println("=====" + domain + " can try");
	// // appendToFile("e:/temp/nstrynew.log", domain + "\n");
	// } else {
	// for (int i = 0; i < answers.length; i++) {
	// System.out
	// .println(domain
	// + " ns="
	// + answers[i]
	// + answers[i].getAdditionalName()
	// .getClass());
	// }
	// String nameServer = answers[answers.length - 1]
	// .getAdditionalName().toString();
	// return nameServer.substring(0, nameServer.length() - 1);
	// }
	// }
	// } catch (TextParseException e) {
	// e.printStackTrace();
	// }
	// } catch (Exception e) {
	// e.printStackTrace();
	// }
	// return "";
	// }

	public static String getWhoisInfoFromBeyondwhois(String domainName)
			throws IOException, Exception {
		String url = "http://result.beyondwhois.com/?domainName=" + domainName;
		String txt = trimEmptyLine(html2txt(HttpUtil.httpGet(url)));
		return (txt);
	}

	public static String getWhoisInfoFromInternic(String domainName)
			throws IOException, Exception {
		String url = "http://reports.internic.net/cgi/whois?whois_nic="
				+ domainName + "&type=domain";
		String txt = trimEmptyLine(html2txt(HttpUtil.httpGet(url)));
		return (txt);
	}

	/**
	 * 从iana获取域名的whois server服务器信息
	 * 
	 * @param domainName
	 * @return
	 * @throws IOException
	 * @throws Exception
	 */
	public static String getWhoisServerInfoFromIana(String domainName)
			throws IOException, Exception {
		String url = "http://www.iana.org/cgi-bin/whois?q=" + domainName;
		String txt = trimEmptyLine(html2txt(HttpUtil.httpGet(url)));
		return (txt);
	}

	public static String getWhoisServer(String domainName) {
		String whoisServer = "";
		if (domainName == null || domainName.length() < 1) {
			return "";
		} else {
			domainName = domainName.toLowerCase();
		}
		for (String[] tldwhois : TLDS_WHOIS_LINUX) {
			if (domainName.endsWith(tldwhois[0]) && tldwhois[1].length() > 0) {
				if (!tldwhois[1].startsWith("\\x0")) {
					return tldwhois[1];
				}
				if (tldwhois[1].startsWith("\\x07")) {
					return "whois.publicinterestregistry.net";
				}
				if (tldwhois[1].startsWith("\\x08")) {
					return "whois.afilias-grs.info";
				}
				if (tldwhois[1].startsWith("\\x04")) {
					// 这些域名需要特殊处理，查询域名的时候要在前面加上等号
					String whoisIndexServer = tldwhois[1].substring("\\x04"
							.length());
					String whoisInfo = getWhoisInfo("=" + domainName,
							whoisIndexServer);
					String whoisServerTmp = findWhoisServer(whoisInfo);
					if (whoisServerTmp != null && whoisServerTmp.length() > 0) {
						return whoisServerTmp;
					}
				}
			}
		}
		System.out.println("try guess from TLDS_WHOIS for:" + domainName);
		if (domainName.contains(".")) {
			String tldDomain = domainName
					.substring(domainName.lastIndexOf(".") + 1);
			System.out.println(tldDomain + "===" + tldDomain);
			for (String[] tldwhois : TLDS_WHOIS) {
				if (tldwhois[0].equals(tldDomain) && tldwhois[1].length() > 0) {
					return tldwhois[1];
				}
			}
		}
		if (true) {
			return "";
		}
		try {
			String txt = getWhoisServerInfoFromIana(domainName);
			BufferedReader in = new BufferedReader(new StringReader(txt));
			String line;
			while ((line = in.readLine()) != null) {
				line = line.trim();
				if (line.contains("whois:")) {
					System.out.println("line==============" + line);
					whoisServer = line.substring("whois:".length()).trim();
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return (whoisServer);
	}

	/**
	 * html去除标签
	 * 
	 * @param s
	 * @return
	 */
	public static String html2txt(String s) {
		if (s != null) {
			String htmlStr = s.replace("<br />", "\n").replace("</tr>", "\n");
			String regEx_script = "<script.*?>.*?</script>"; // 定义script的正则表达式{或<script
			String regEx_style = "<style.*?>.*?</style>"; // 定义style的正则表达式{或<style
			Pattern p_script = Pattern.compile(regEx_script,
					Pattern.CASE_INSENSITIVE | Pattern.MULTILINE
							| Pattern.DOTALL);
			Matcher m_script = p_script.matcher(htmlStr);
			htmlStr = m_script.replaceAll(""); // 过滤script标签

			Pattern p_style = Pattern.compile(regEx_style,
					Pattern.CASE_INSENSITIVE | Pattern.MULTILINE
							| Pattern.DOTALL);
			Matcher m_style = p_style.matcher(htmlStr);
			htmlStr = m_style.replaceAll(""); // 过滤style标签
			Pattern p_html = Pattern.compile("<.*?>", Pattern.CASE_INSENSITIVE
					| Pattern.MULTILINE | Pattern.DOTALL);
			Matcher m_html = p_html.matcher(htmlStr);
			htmlStr = m_html.replaceAll(""); // 过滤html标签
			return htmlStr.replace("&nbsp;", " ");

		}
		return "";
	}

	public static String trimEmptyLine(String s) throws IOException {
		StringBuilder sb = new StringBuilder(s.length() + 16);
		BufferedReader br = new BufferedReader(new StringReader(s));
		String line;
		while ((line = br.readLine()) != null) {
			String trimLine = line.trim();
			if (trimLine.length() > 0) {
				sb.append(trimLine).append('\n');
			}
		}
		return sb.toString();
	}

	public static void main(String[] args) {
		// System.out.println(WhoisClient.getWhoisInfo("google.org.ar"));
		// System.out.println(WhoisClient.getWhoisInfo("google.com.az"));
		System.out.println(WhoisClient.getWhoisInfo("google.com.ge"));
		// for (String tld : TLDS) {
		// String domain = "google." + tld;
		// System.out.println(domain + " whois ="
		// + WhoisClient.getWhoisServer(domain));
		//
		// }
		//
		// for (String tldwhois[] : TLDS_WHOIS) {
		// String tld = "." + tldwhois[0];
		// for (String tldwhoislinux[] : TLDS_WHOIS_LINUX) {
		// if (tld.equals(tldwhoislinux[0])) {
		// if (!tldwhois[1].equals(tldwhoislinux[1])) {
		// // System.out.println(tld + " whois ==" + tldwhois[1]
		// // + " ,but " + tldwhoislinux[1]);
		// if (tldwhoislinux[1].startsWith("\\x01")) {
		// System.out.println(tld + " web whois:"
		// + tldwhoislinux[1]);
		//
		// }
		// }
		// }
		// }
		// }
		//
		// for (String[] tldweb : TLDS_WHOIS_WEB) {
		// String fileName = tldweb[0].toUpperCase().substring(1).trim()
		// + "DomainHandler";
		// System.out.println("handlerMap.put(\"" + tldweb[0] + "\",new "
		// + fileName + "());");
		// }
	}
}
